package d_decrator.b_design_pattern;

/**
 * Created by wug on 2016/6/22 0022.
 */
public class MainTest {
    public static void main(String[] args) {
        Component computer = new Mainboard();
        computer = new CPU(computer);
        computer = new RAM(computer);
        computer = new HardDisk(computer);
        computer = new Power(computer);

        System.out.println("----------配置如下---------");
        System.out.println(computer.showDesc());
        System.out.println("===========总价===========");
        System.out.println(computer.showPrice());

        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");

        Component computer1 = new Mainboard();
        computer1 = new CPU(computer1);
//        computer1 = new RAM(computer1);

        /**
         * 这里为什么这么写？
         *
         * 因为DoubleComponent 的构造方法需要的是Decorator
         * 如果赋值给Component 对象类型发生变化了
         */
        computer1 = new DoubleComponent(new RAM(computer1));
        /**
         * 这里的意思 是 1条内存 double 为 D_RAM(双内存) 然后 这个双内存的 再double
         *
         * 结果就是 （双内存 - 100） + （双内存 - 100）
         * 然后 双D_RAM - 100
         * 所以一共 -300
         */
//        computer1 = new DoubleComponent(new DoubleComponent(new RAM(computer1)));
        computer1 = new HardDisk(computer1);
        computer1 = new Power(computer1);
        computer1 = new BlueTooth(computer1);
        computer1 = new AllInOne(computer1);
        /**
         * 其实你可以这么写
         */
//        Component computer1 = new AllInOne(new BlueTooth(new Power(new HardDisk(new DoubleComponent(new RAM(new CPU(new Mainboard())))))));
        System.out.println("----------配置如下---------");
        System.out.println(computer1.showDesc());
        System.out.println("===========总价===========");
        System.out.println(computer1.showPrice());

        /**
         * 你会发现 我们再也不需要给ShopManager发工资了  因为我们根本没有用到它
         *
         * 你还会发现 以后（运营）只要告诉我们活动规则就行了 具体这些活动规则怎么组合，让他们（销售）自己处理吧 哈哈哈哈！！！
         */


        /**
         * 然后你发现了 原来这货就是它 没错就是《装饰者模式》
         */
        /*try {
            File file = new File("");
            new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }*/

    }
}
